﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccesoDatos.IDAO;
using Entidades;
using log4net;
using NHibernate;

namespace AccesoDatos.DAO
{
    public class DaoApuesta : IDAO.IDaoApuesta
    {
        protected static readonly ILog log = LogManager.GetLogger(typeof(DaoApuesta));

        public IList<Apuesta> SeleccionarTodos()
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Entra en el metodo SeleccionTodos de apuesta");
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                IQuery query = sesion.CreateQuery("from Apuesta");
                IList<Apuesta> retorna = (IList<Apuesta>)query.List<Apuesta>();
                sesion.Transaction.Commit();
                log.Info("Se retorna con éxito la lista de apuestas");
                return retorna;

            }
            catch (Exception exception)
            {
                log.Error("Error al seleccionar todas las apuestas");
                log.Error(exception.Message);
                throw new Exception();
            }
          

        }

        public Apuesta SeleccionarPorId(int id)
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Entra en el metodo SeleccionarPorId recibiendo el id: " + id);
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                Apuesta busqueda = (Apuesta)sesion.Get(typeof(Apuesta), id);
                sesion.Transaction.Commit();
                log.Info("Apuesta retornada con éxito");
                return busqueda;
            }
            catch (Exception exception)
            {
                log.Error("Error al retornar la maquina bajo el id: " + id);
                log.Error(exception.Message);
                throw new Exception();
            }
          
        }

        public void Insertar(Apuesta c)
        {
            log4net.Config.XmlConfigurator.Configure();
            log.Info("Entra en insertar con los valores: " + c.Idapuesta + c.Historial + c.Maquina + c.Monto + c.Posicionpuntos + c.Fecha);
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            ITransaction transaccion = null;
            //try
            //{
                transaccion = sesion.BeginTransaction();
                sesion.Save(c);
                transaccion.Commit();
                sesion.Flush();
                log.Info("Apuesta insertada con éxito");

            //}
            //catch (Exception exception)
            //{
            //    // throw new ExcepcionDao(exception.Message,exception.Source);
            //    exception.GetBaseException();
            //    if (transaccion != null)
            //    {
            //        log.Error("No se puedo insertar la apuesta " + c.Idapuesta);
            //        log.Error(exception.Message);
            //        transaccion.Rollback();
            //        throw new Exception();
            //    }
            //}

        }

        public void Modificar(Apuesta c)
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("entra en modificar con los parametros: ");
                ConfiguracionNHibernate.CloseSession();
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                sesion.Update(c);
                sesion.Transaction.Commit();
                log.Info("Apuesta modificada con exito");
            }
            catch (Exception exception)
            {
                log.Error("No se pudo modificar la Apuesta");
                log.Info(exception.Message);
                throw new Exception();
            }
        }

        public void EliminarPorId(int id)
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("entra en eliminar bajo el id: " + id);
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                sesion.Delete((Apuesta)sesion.Get(typeof(Apuesta), id));
                sesion.Transaction.Commit();
                log.Info("Apuesta eliminada");
            }
            catch (Exception exception)
            {
                log.Error("error al eliminar apuesta");
                log.Error(exception.Message);
                throw new Exception();
            }
            
        }

        public IList<Apuesta> SeleccionarPorParametro(string parametro, string valor)
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("entra en seleccionar por parametro recibiendo: parametro: " + parametro + "valor:" + valor);
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                IQuery query = sesion.CreateQuery("from MaquinaApuesta where " + parametro + " = '" + valor + "'");
                IList<Apuesta> retorna = (IList<Apuesta>)query.List<Apuesta>();
                sesion.Transaction.Commit();
                log.Info("Apuesta retornadas con éxito");
                return retorna;
            }
            catch (Exception exception)
            {
                log.Error("no se pudo retornar las apuesta bajo esas condiciones");
                log.Info(exception.Message);
                throw new Exception();
            }
           
        }

        public IList<Apuesta> SeleccionarPorParametro(string parametro, int valor)
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("entra en seleccionar por parametro recibiendo: parametro: " + parametro + "valor:" + valor);
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                IQuery query = sesion.CreateQuery("from Apuesta where " + parametro + " = '" + valor + "'");
                IList<Apuesta> retorna = (IList<Apuesta>)query.List<Apuesta>();
                sesion.Transaction.Commit();
                log.Info("Apuestas retornadas con éxito");
                return retorna;
            }
            catch (Exception exception)
            {
                log.Error("no se pudo retornar las apuestas bajo esas condiciones");
                log.Info(exception.Message);
                throw new Exception();
            }

           

        }

        public bool InsertarToken(Token c)
        {
            log4net.Config.XmlConfigurator.Configure();
            log.Info("Entra en insertar token ");
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            ITransaction transaccion = null;
            try
            {
                transaccion = sesion.BeginTransaction();
                sesion.Save(c);
                transaccion.Commit();
                sesion.Flush();
                log.Info("Token insertado con éxito");

            }
            catch (Exception exception)
            {
                // throw new ExcepcionDao(exception.Message,exception.Source);
                exception.GetBaseException();
                if (transaccion != null)
                {
                 
                    throw new Exception();
                }
            }
            return true;
        }

        public IList<Token> SeleccionarTodosToken()
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Entra en el metodo SeleccionTodos de apuesta");
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                IQuery query = sesion.CreateQuery("from Token");
                IList<Token> retorna = (IList<Token>)query.List<Token>();
                sesion.Transaction.Commit();
                log.Info("Se retorna con éxito la lista de apuestas");
                return retorna;

            }
            catch (Exception exception)
            {
                log.Error("Error al seleccionar todas los token");
                log.Error(exception.Message);
                 throw new Exception();
            }
          

        }
        public Token SeleccionarTokenPorId(string id)
        {
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Entra en el metodo SeleccionarTokenPorId recibiendo el id: " + id);
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                Token busqueda = (Token)sesion.Get(typeof(Token), id);
                sesion.Transaction.Commit();
                log.Info("Apuesta retornada con éxito");
                return busqueda;
            }
            catch (Exception exception)
            {
                log.Error("Error al retornar token bajo el id: " + id);
                log.Error(exception.Message);
                throw new Exception();
            }

        }
    }
}